# app.py
from flask import Flask, render_template
import pandas as pd
import os
from datetime import datetime

app = Flask(__name__)

DATA_FILE = 'data/fund_data.csv'

def get_ranking_data():
    if not os.path.exists(DATA_FILE):
        return None, None, "数据文件不存在，请先运行 update_data.py 更新数据。"

    try:
        df = pd.read_csv(DATA_FILE)
        # 确保涨跌幅列为数值型（处理可能的字符串）
        df['日增长率'] = pd.to_numeric(df['日增长率'], errors='coerce')
        df.dropna(subset=['日增长率'], inplace=True)

        # 动态获取最新净值的列名（匹配包含'单位净值'的列）
        net_value_columns = [col for col in df.columns if '单位净值' in col]
        if not net_value_columns:
            return None, None, "未找到单位净值列"
        
        # 假设最新的净值列通常在后面，或者我们可以根据列名中的日期排序
        net_value_columns.sort(reverse=True)  # 按列名排序，假设日期格式一致
        latest_net_value_col = net_value_columns[0]
        
        # 从列名中提取日期信息（假设格式为'YYYY-MM-DD-单位净值'）
        latest_date = "未知日期"
        try:
            # 尝试从列名中提取日期部分
            date_part = latest_net_value_col.split('-单位净值')[0]
            if date_part:
                latest_date = date_part
        except Exception:
            latest_date = "未知日期"
        
        # 排序取前100
        top_gainers = df.sort_values(by='日增长率', ascending=False).head(100)
        top_losers = df.sort_values(by='日增长率', ascending=True).head(100)
        
        # 转成字典列表传给前端，并添加最新净值列名信息
        gainers_list = top_gainers[['基金代码', '基金简称', latest_net_value_col, '日增长率']].to_dict(orient='records')
        losers_list = top_losers[['基金代码', '基金简称', latest_net_value_col, '日增长率']].to_dict(orient='records')
        
        # 获取更新时间
        update_time = df['update_time'].iloc[0] if 'update_time' in df.columns else "未知"
        
        return gainers_list, losers_list, update_time, latest_net_value_col, latest_date
    except Exception as e:
        return None, None, f"读取或处理数据出错: {e}", None, None

@app.route('/')
def index():
    gainers, losers, msg, latest_net_value_col, latest_date = get_ranking_data()
    if gainers is None:
        return f"<h3 style='color:red;'>加载失败: {msg}</h3>"
    
    return render_template('index.html', 
                           gainers=gainers, 
                           losers=losers, 
                           update_time=msg,
                           latest_net_value_col=latest_net_value_col,
                           latest_date=latest_date)

if __name__ == '__main__':
    app.run(debug=True)